Notifications
Clear all

Facilitar escrita de codigo

30 Posts
4 Usuários
0 Reactions
2,890 Visualizações
(@mprudencio)
Posts: 2749
Famed Member
Topic starter
 

Bom dia nem sei se o titulo é o mais adequado, mas como estou me aventurando no mundo do VBA, me surgiu um questionamento

Tenho dois codigos que fazem basicamente a mesma coisa.

Ambos identificam um determinado valor em uma celula e copia a linha inteira e cola em outra aba, realizam outras tarefas mas o basico é isso

Primeiro codigo

Sub Baixa()

Application.ScreenUpdating = False

Sheets("Contas a Pagar").Select

Range("H7").Select

Do While ActiveCell <> ""

If ActiveCell.Value = "PAGO" Then

      Intersect(Selection.EntireRow, _
               Range("A:G")).Select
                     Selection.Copy
      
             Sheets("Pagos").Select
    
   Range("A1048576").End(xlUp).Select
       ActiveCell.Offset(1, 0).Select
       
            With Selection
            .PasteSpecial Paste:=xlPasteValues
            .PasteSpecial Paste:=xlPasteFormats
            End With
                
        Range("A6").Select
                
            Sheets("Contas a Pagar").Select
    
    ActiveCell.EntireRow.Delete
    
    ActiveCell.Offset(0, 7).Select
    
    Else
    
    ActiveCell.Offset(1, 0).Select

    End If

    Loop
    
    Range("A7").Select
    
    ActiveWorkbook.RefreshAll
    
    MsgBox "Dados Atualizados Com Sucesso", vbOKOnly, "Atualizando Dados..."
           
    Application.ScreenUpdating = True
    
    ActiveWorkbook.Save
    
End Sub

Segundo codigo


Private Sub Cidade()

Dim WL As Worksheet
Dim WR As Worksheet
Dim WG As Worksheet
Dim WM As Worksheet
Dim SNOME As String
Dim ORG As String
Dim CID As String
Dim NOM As String
Dim CARG As String
Dim FUN As String
Dim VIN As String
Dim SIT As String
Dim LOT As String
Dim VEN As Currency
Dim I As Long
Dim J As Long
Dim Linha As Long
Dim Ulinha As Long
Dim Lin As Long
Dim Ulin As Long
Dim WGLin As Long

Set WL = Sheets("Listas")
Set WR = Sheets("Relação Geral")
Set WM = Sheets("Modelo")
    Linha = 6
    Lin = 6
    Ulin = WR.Range("C" & Rows.Count).End(xlUp).Row
    Ulinha = WL.Range("C" & Rows.Count).End(xlUp).Row
    
For I = Linha To Ulinha

    SNOME = WL.Cells(Linha, 3).Value
    WM.Copy After:=Sheets(Sheets.Count)
Set WG = Sheets("Modelo (2)")

For J = Lin To Ulin
    
    ORG = WR.Cells(Lin, 2).Value
    CID = WR.Cells(Lin, 3).Value
    NOM = WR.Cells(Lin, 4).Value
   CARG = WR.Cells(Lin, 5).Value
    FUN = WR.Cells(Lin, 6).Value
    VIN = WR.Cells(Lin, 7).Value
    SIT = WR.Cells(Lin, 8).Value
    LOT = WR.Cells(Lin, 9).Value
    VEN = WR.Cells(Lin, 10).Value

If WR.Cells(Lin, 3).Value = SNOME Then

WGLin = WG.Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Row
WG.Cells(WGLin, 2).Value = ORG
WG.Cells(WGLin, 3).Value = CID
WG.Cells(WGLin, 4).Value = NOM
WG.Cells(WGLin, 5).Value = CARG
WG.Cells(WGLin, 6).Value = FUN
WG.Cells(WGLin, 7).Value = VIN
WG.Cells(WGLin, 8).Value = SIT
WG.Cells(WGLin, 9).Value = LOT
WG.Cells(WGLin, 10).Value = VEN

End If

Lin = Lin + 1

Next

ActiveSheet.Name = SNOME
Linha = Linha + 1
Lin = 6

Next

End Sub


Dependendo da quantidade de linhas o segundo codigo é de longe mais rapido no processamento que o segundo, e embora o segundo seja "mais facil de escrever" ja que é menos sucetivel a erros porque o proprio editor facilita a escrita, ele é muito mais trabalhoso ja que o numero de variaveis é muito maior e consequentemente mais detalhado.

Minha pergunta é da pra escrever o segundo codigo com menos linhas e sem a necessidade de declarar tantas variaveis.

Estou vendo a coisa do ponto de vista de quem esta escrevendo o codigo.

Acho o primeiro mais rapido para escrever pelo fato de ser menor.

Aguardo sugestões.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 26/01/2016 9:10 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Em geral usar o .Value = .Value é melhor e mais rápido que usar o .Copy e o .Paste. Claro que se vc queria filtrar o conteúdo, ou seja, remover alguns itens, o .value = .value direto com uma linha só, não faria isso, mas vc poderia fazer a linha inteira = linha inteira ao invés de célula por célula, isso já aceleraria...

Dito isso, bacana, alguém está medindo o tempo disso?
Não entendi pq até agora ninguém usou matrizes, isso inclui você, Edcronos....

Eu estou sem tempo de fazer isso agora, mas eu juro pra vocês, que li todos os códigos aqui postados, e eu posso pegar qquer um deles, lá da primeira postagem do tópico, e editar, vou usar somente matrizes, e eu derrubo o tempo de execução em 95%.

Seu tópico apesar de falar da facilidade em escrever, Marcelo, nem sempre o modo de escrever mais fácil é o que vai executar mais rápido. às vezes pode até ser o caso... Mas não neste...
Puxar todo o conteúdo numa matriz, varrer a matriz ao invés de varrer a planilha, criar outra matriz baseada na primeira, somente com os itens que vc quer, e no final derrubar a matriz na planilha destino..

O meu algoritmo seria esse, com alguns códigos do meu modelo de programação postado há um tempo...

mtz = PegarMatriz(PegarUSedRange(Planilha))
mtzFiltrada = FIltrarMatriz(matriz:=mtz, Campo:=5, Critério:="Critério Qualquer")
Call DerrubarMatriz(Planilha:=PlanilhaDestino, LInha:=1, Coluna:=1, Matriz:=mtzFiltrada

Claro que PegarMatriz, FiltrarMatriz, e DerrubarMatriz *(GetARrayFromRange, FilterArray e DropArray) são rotinas minhas que eu tenho escritas e são reutilizáveis....

Bom, se alguém quiser ver isso aplicado, me avisa.. Minhas rotinas são Plug and Play ! ;-)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 28/01/2016 11:37 am
(@mprudencio)
Posts: 2749
Famed Member
Topic starter
 

Fernando obrigado pela dica, mas ainda to longe de conseguir algo desse tipo, minha preocupação neste momento não é a velocidade de execução, e importante, mas não é esse o caso de estudo.

Gostaria sim que exemplificasse sua colocação na pratica com base no que disse de interesse conhecimento sempre é bom.

Estou buscando facilitar nao a execução, mas estou levantando a bandeira de quem esta escrevendo o codigo.

Entenda que pra quem esta escrevendo o codigo escrever isso:

Range("A2:M2").Select
Selection.copy

E muito mais rapido que escrever

cells(2,1).value
cells(2,2_.value
..
..
..
..
cells(2,12).value

Entao em resumo a ideia e escrever de forma simples e mais rapido (menos trabalhoso), do que essa forma que esta escrito a segunda parte do exemplo e sem usar as instruções select, selection e por ae vai.

Começei treinar escrever sem uso de select porem achei trabalhoso demais principalmente qdo se tem uma tabela muito grande,

Uma tabela que tenha que copiar 20 colunas sao 20 linhas de instrução, é obvio que se usa ctrl+c ctrl+v e se corrige linhas e colunas conforme necessidade, mas como disse achei um trabalho muito braçal

Escrevendo assim sinto como se fosse fazer uma soma e na celula escrevesse assim:

A1+A2+A3+A4+.........A20 e a intenção e aprender escrever assim =soma(A1:A20) ou seja fazem a mesma coisa porem com muito mais facilidade de entender e escrever principalmente.

Alguns exemplos ja foram dados mas como o Edcronos disse que é possivel escrever o mesmo comando com array e usando a instrução with conheço, ja entendi o que ela faz, mas uso com muita dificuldade.

Entao se quiser deixar um exemplo conforme disse com base no codigo postado fico agradecido.

Do ponto de vista de quem esta escrevendo

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 28/01/2016 12:05 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

neste caso, Marcelo, a questão é que vc não precisa usar célula por célula... use intervalos...
Pois vc está insistindo em escrever coluna por coluna, mas não precisa, ólha:

PlanDestino.range("A" & linDestino & ":Z" & linDestino).Value= _
PlanOrigem.range("A" & linORigem & ":Z" & linORigem).Value

E sim, Escrever Range().Select e depois, Selection.Copy pode parecer mais fácil, mas é mais fácil ainda, ir direto pro Copy, assim:

Range("A" & linORigem & ":Z" & linOrigem).Select
Selection.Copy

Vc trocaria por

Range("A" & linORigem & ":Z" & linOrigem).Copy

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 28/01/2016 12:21 pm
(@mprudencio)
Posts: 2749
Famed Member
Topic starter
 

Entendi isso

PlanDestino.range("A" & linDestino & ":Z" & linDestino).Value= _
PlanOrigem.range("A" & linORigem & ":Z" & linORigem).Value

Mas nao consegui adaptar para isso


            WG.Cells(WGLin, 2).Value = WR.Cells(Lin, 2).Value 'ORG
            WG.Cells(WGLin, 3).Value = WR.Cells(Lin, 3).Value 'CID
            WG.Cells(WGLin, 4).Value = WR.Cells(Lin, 4).Value 'NOM
            WG.Cells(WGLin, 5).Value = WR.Cells(Lin, 5).Value 'CARG
            WG.Cells(WGLin, 6).Value = WR.Cells(Lin, 6).Value 'FUN
            WG.Cells(WGLin, 7).Value = WR.Cells(Lin, 7).Value 'VIN
            WG.Cells(WGLin, 8).Value = WR.Cells(Lin, 8).Value 'SIT
            WG.Cells(WGLin, 9).Value = WR.Cells(Lin, 9).Value 'LOT
            WG.Cells(WGLin, 10).Value = WR.Cells(Lin, 10).Value 'VEN

A ideia não é usar select, selection, copy, e outras rotinas que deixam a execução lenta.

A ideia e fazer algo que fique com cara de profissional, mas que nao seja demorado em escrever, a parte do texto que escrevi usando select é somente pra exemplificar.

Essa tabela de exemplo tem 9 colunas entao nao preocupa tanto so preocupa pelo fato de se ter uma tabela muito maior entao a ideia e facilitar isso quando for escrever o codigo.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 28/01/2016 12:49 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 
WG.Cells(WGLin, 2).Value = WR.Cells(Lin, 2).Value 'ORG
WG.Cells(WGLin, 3).Value = WR.Cells(Lin, 3).Value 'CID
WG.Cells(WGLin, 4).Value = WR.Cells(Lin, 4).Value 'NOM
WG.Cells(WGLin, 5).Value = WR.Cells(Lin, 5).Value 'CARG
WG.Cells(WGLin, 6).Value = WR.Cells(Lin, 6).Value 'FUN
WG.Cells(WGLin, 7).Value = WR.Cells(Lin, 7).Value 'VIN
WG.Cells(WGLin, 8).Value = WR.Cells(Lin, 8).Value 'SIT
WG.Cells(WGLin, 9).Value = WR.Cells(Lin, 9).Value 'LOT
WG.Cells(WGLin, 10).Value = WR.Cells(Lin, 10).Value 'VEN

=

WG.Range("B" & WGLin & ":J" & WGLin).Value = WR.Range("B"& Lin & ":J" & Lin).Value

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 28/01/2016 12:56 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 
           WG.Range(WG.Cells(WGLin, 2), WG.Cells(WGLin, 10)).Value = _
WR.Range(WR.Cells(Lin, 2), WR.Cells(Lin, 10)).Value

Que é o que o Edcronos já tinha sugerido, mas com um código ligeiramente mais difícil de ler... mas faz que exatamente a mesma coisa !

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 28/01/2016 1:00 pm
(@mprudencio)
Posts: 2749
Famed Member
Topic starter
 

Ele disse tb que daria pra usar array ou with. Isso é possivel?

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 28/01/2016 1:07 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pra usar array, vai complicar toda a escrita do código, e vai parecer complicado, vai contra o que vc mesmo pediu...

Aqui não indico o uso do With... Pq se vc mata todas as linhas substituindo por uma, o with teria q estar fora do loop,
dificultando mesmo que pouco, a leitura geral do código. Pra vc q está aprendendo, sugiro não usar o With neste caso.

MAs o Edcronos mandou bem e está certo, poderia usar sim *(olha só, eu elogiando o Ed, uiaaaa parabéns Ed).

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 28/01/2016 1:10 pm
(@mprudencio)
Posts: 2749
Famed Member
Topic starter
 

Entendido...

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 28/01/2016 2:05 pm
(@edcronos2)
Posts: 346
Reputable Member
 

ola,
desculpa por não ter respondido
é que estou em um paradoxo temporal de um pseudo universo

sai do grupo de física teórica
mas como eu aprendo criando uma imagem mental e comparando com uma logica, acabei fazendo merda na minha mente

desculpa ainda estou com a cabeça cheia de atomo protons eletrons quark entrelaçamento quântico e essas coisas
e para piorar com a ideia de espaço tempo mudável

quando eu esvazia a cabeça eu te explico algumas coisas
mas se vc está com dificuldade de aprender isso depois desse tempo fazendo
aconselho tentar outros modelos aprendizagens
eu tenho a mania de se chato kkk
né frenando

esse modelo seu com array iria mudar tudo
mas para mim deste o inicio ficou mais facil que o modo que esse pessoal usa

array seria assim
array(linha, coluna)
é igual a cells, mas funciona como range

array = range("A1:D10").value2

Array(1,1)>>a1
Array(2,1)>>a2
Array(3,1)>>a3

Array(1,1)>>a1
Array(1,2)>>b1
Array(1,3)>>c1

Array(2,3)="joão"
seria como Cells(2,3)= "joão"
e para colar de volta para a planilha

range("A1:D10").value2=Array

mas tem um porem
Arrays de range sempre são variante e sempre começa em 1

array = range("hh10:HH1000").value2
Array(1,1)>>hh10
Array(2,1)>>hh11
Array(3,1)>>hh12

Array(1,1)>>hh10
Array(1,2)>>erro pq só tem uma coluna
Array(1,3)>>erro

 
Postado : 29/01/2016 1:50 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu elogio o cara e ele manda uma dessa.... vontade de socar agora, kkkk

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 29/01/2016 10:46 am
(@mprudencio)
Posts: 2749
Famed Member
Topic starter
 

Edcronos obrigado deu pra ter uma ideia de como funciona.

Não liga pro Fernando não ele assim mesmo...

:lol: :lol:

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 29/01/2016 12:50 pm
(@edcronos2)
Posts: 346
Reputable Member
 

não
o chato sou eu
ele pensa
eu penso
nos discordamos
kkk
não pode é sair tapa fisico, se for em palavras não fujo não, mas tem que ser com respeito

 
Postado : 29/01/2016 1:55 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu respeito o Ed, mesmo discordando dele. Mas digamos, não é só uma discórdia simples, eu discordo de tudo. Por mim, ele não fala nada com nada. Não entendo uma vírgula do que ele diz *(e ele tb não me entende)..

Eu desisti de tentar !

Melhor ficar no respeito mútuo mesmo, kkk

Abraço meninos, bom fds !!

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 29/01/2016 2:17 pm
(@edcronos2)
Posts: 346
Reputable Member
 

MPrudencio
vc está com sorte que estou explicando de modo simples
quando eu fui aprender foi osso
o pessoal complica
é imagem de um cubo, é sobre vetorização, dimenção,
aí tem o fato do array nomalmente começar em zero e vc não saber lidar com arrays e planilhas pq são totalmente diferentes
eu tive que fazer centenas de testes até descobrir como funciona realmente
e dá raiva depois de tudo isso descobrir que é tão simples

arrays são basicamente uma planilha dentro do vba só que com o tamanho limite de celulas

ranges são conjutos de celulas
nos arrays só se pode copiar blocos completos ou fazer loops em celulas individuais

nada mais que isso
a unica diferença é que celulas tem características diferentes como cor e formato,
arrays são só valores
se vc faz um array de formulas eles serão isso a propria formula e não o resultado
oque está dentro do array se calcula e se manipula, mas não manipula nem calcula outra coisas
formulas são como programas onde se encaixa os dados

 
Postado : 29/01/2016 2:23 pm
Página 2 / 2